﻿package kit4j.ui.cs.swing.component;

import javax.swing.JComboBox;

import kit4j.ui.cs.SimpleCharset;
import kit4j.ui.cs.exception.ListNoSelectionException;

/**
 * SimpleCharset对象的列表的组件。用户可从列表中选择SimpleCharset对象。
 * 
 * @author MiniKnife
 * 
 */
public class JSimpleCharsetComboBox extends JComboBox {

	private static final long serialVersionUID = 1L;

	public JSimpleCharsetComboBox() {
		this(null);
	}

	public JSimpleCharsetComboBox(SimpleCharset[] charsets) {
		super();

		setRenderer(new JSimpleCharsetListCellRenderer());

		if (charsets != null) {
			for (SimpleCharset sc : charsets) {
				addItem(sc);
			}
		}
	}

	/**
	 * 返回最小的选择单元索引的SimpleCharset；只选择了列表中单个项时，返回所选值。选择了多项时，返回最小的选择索引的值。
	 * 
	 * @return 当所选的第一个SimpleCharset
	 * @throws ListNoSelectionException
	 *             如果列表什么也没有选择，抛出此异常。
	 */
	public SimpleCharset getSelectedSimpleCharset() throws ListNoSelectionException {
		SimpleCharset sc = (SimpleCharset) super.getSelectedItem();

		if (sc == null) {
			throw new ListNoSelectionException();
		}

		return sc;
	}

	/**
	 * 返回所有选择SimpleCharset的数组，根据其列表中的索引顺序按升序排序。
	 * 
	 * @return 所选SimpleCharset
	 * @throws ListNoSelectionException
	 *             如果列表什么也没有选择，抛出此异常。
	 */
	public SimpleCharset[] getSelectedSimpleCharsets() throws ListNoSelectionException {
		SimpleCharset[] charsets = (SimpleCharset[]) super.getSelectedObjects();

		if (charsets.length == 0) {
			throw new ListNoSelectionException();
		}

		return charsets;
	}

	/**
	 * 从SimpleCharset列表中选择指定的SimpleCharset。如果列表中不存在此SimpleCharset，则什么也不做， 建议使用替代方法
	 * JSimpleCharsetComboBox#setSelectedSimpleCharset(SimpleCharset)。
	 * 
	 * @param item
	 *            要选择的SimpleCharset
	 * @throws IllegalArgumentException
	 *             如果参数对象不是SimpleCharset类型，抛出此异常。
	 */
	@Override
	public void setSelectedItem(Object item) throws IllegalArgumentException {
		if (!(item instanceof SimpleCharset)) {
			throw new IllegalArgumentException("Argument must be a SimpleCharset");
		}

		super.setSelectedItem(item);
	}

	/**
	 * 设置SimpleCharset列表中的列表项。
	 * 
	 * @throws IllegalArgumentException
	 *             如果参数对象不是SimpleCharset类型数组，抛出此异常。
	 */
	public void setItems(Object[] items) throws IllegalArgumentException {
		if ((items != null) && !(items instanceof SimpleCharset[])) {
			throw new IllegalArgumentException("Argument must be a SimpleCharset list");
		}

		removeAllItems();
		for (Object item : items) {
			addItem(item);
		}
	}
}
